﻿#pragma once

#include <QtWidgets/QMainWindow>
#include <QFileDialog>
#include <qmessagebox.h>
#include <QApplication>
#include <QPlainTextEdit>
#include <QKeyEvent>
#include <QDebug>
#include "NoteUtil.h"

//md格式、源代码模式、专注模式、打字机模式
//markdown 与code互斥；focused、typewriter二者可同时使用
struct ViewMode
{
    bool base;//true: markdown 格式；false: code 模式
    bool focused;//true: 应用专注模式；false: 不应用专注模式
    bool typewriter;//true: 应用打字机模式；false: 不应用打字机模式
    bool newChange;//转换源代码、markdown格式用，代表最近是否有转换过
    ViewMode(bool base = true,bool focused = false,bool typewriter = false, bool newChange = false):base(base), focused(focused), typewriter(typewriter), newChange(newChange) {}
};

//请将所有与NotePad设置（偏好）的属性添加在该静态类！
class NotePadConfig
{
public:
    ViewMode view_mode_default;//视图模式
    QString UI;//界面主题设置
    bool full_screen_default;//true:全屏;false:窗口化
    int x_size_default;//窗口化时的默认x轴长度
    int y_size_default;//窗口化时的默认y轴长度
    bool auto_save;//是否启用默认保存
    QString language;
    int font_size_default;//字体大小

    //其他等待添加(添加新属性后请加入构造函数与getInstance函数中)

    //使用单例模式获取实例（保证全局唯一）
    inline static NotePadConfig& getInstance(
        ViewMode view_mode_default= ViewMode(),
        QString UI = "default",
        bool full_screen_default = false,
        int x_size_default = 1280,
        int y_size_default = 720,
        bool auto_save = true,
        QString language = "zh",
        int font_size_default = 14)
    {
        static NotePadConfig instance(
            UI, view_mode_default, full_screen_default, x_size_default,
            y_size_default, auto_save, language, font_size_default);
        return instance;
    }

    NotePadConfig(const NotePadConfig&) = delete;
    NotePadConfig& operator=(const NotePadConfig&) = delete;
    virtual ~NotePadConfig() {}
private:
    inline NotePadConfig(
        QString UI, ViewMode view_mode_default,
        bool full_screen_default, int x_size_default,
        int y_size_default, bool auto_save,
        QString language, int font_size_default)
    {
        this->UI = UI;
        this->view_mode_default = view_mode_default;
        this->full_screen_default = full_screen_default;
        this->x_size_default = x_size_default;
        this->y_size_default = y_size_default;
        this->auto_save = auto_save;
        this->language = language;
        this->font_size_default = font_size_default;
    }
};
#define NotePadConfig (NotePadConfig::getInstance())
